package com.gxa.learning.pc.service;

import com.gxa.learning.core.exception.BusinessException;
import com.gxa.learning.core.pojo.ExamineApproval;
import com.gxa.learning.core.pojo.FlowPathNode;
import com.gxa.learning.core.pojo.TrainPlan;
import com.gxa.learning.core.pojo.TrainPlanVo;
import com.gxa.learning.core.service.BaseService;

import java.util.List;

/**
 * 培训计划的业务层接口
 *
 * @author YXQ
 * @date 2021/12/2 18:20
 */
public interface TrainPlanService extends BaseService<TrainPlan> {
    /**
     * 根据条件查询得到计划信息的方法
     *
     * @param name     计划名称
     * @param planType 计划的状态
     * @param type     计划的所属类别
     * @param page     页数
     * @param size     每页记录数
     * @return 集合
     */
    List<TrainPlanVo> selectQueryAndPage(String name, String planType, String type, Integer page, Integer size);

    /**
     * 根据培训计划的id值查找该计划的详细信息
     *
     * @param id 计划的编号
     * @return 计划的详细信息的Vo对象
     */
    TrainPlanVo selectTrainPlanDetails(Long id);

    /**
     * 根据当前登录用户的id值 查找 待审批计划的详细信息
     *
     * @param id 用户的id
     * @return 待审批计划的集合
     */
    List<TrainPlanVo> selectWaitExamineList(Long id);

    /**
     * 根据当前登录用户的id值 查找 已审批计划的详细信息
     *
     * @param id 用户的id
     * @return 待审批计划的集合
     */
    List<TrainPlanVo> selectAlreadyExamineList(Long id);

    /**
     * 根据当前登录用户的id值 查找 审批进度中的计划的详细信息
     *
     * @param id 用户的id
     * @return 审批进度中的计划的集合
     */
    List<TrainPlanVo> selectGetMyExamineApprovalsList(Long id);

    /**
     * 审批计划的操作
     *
     * @param id     当前登录用户的id
     * @param planId 当前审核计划的id
     * @param option 被这个计划的审核意见
     * @return 审核成功或失败
     * @throws BusinessException 异常
     */
    Boolean agreeOrRefuse(Long id, Long planId, String option) throws BusinessException;

    /**
     * 通过当前用户的id和计划的id值找到一个唯一确定的流程节点
     *
     * @param userId 当前用户的编号
     * @param planId 当前计划的编号
     * @return 流程节点
     */
    FlowPathNode selectByUserAndPlan(Long userId, Long planId);

    /**
     * 通过计划的id值找到对应的审批流程的意见征询的节点数
     *
     * @param planId 计划的id
     * @return 意见征询节点个数
     */
    ExamineApproval selectOpinionCount(Long planId);

    /**
     * 通过计划的id值找到已同意的个数
     *
     * @param planId 计划的id值
     * @return 已同意的节点的个数
     * @throws BusinessException 异常
     */
    Integer selectAlreadyAgreeCount(Long planId) throws BusinessException;

    /**
     * 通过计划的id值找到不同意的个数
     *
     * @param planId 计划的id值
     * @return 已同意的节点的个数
     * @throws BusinessException 异常
     */
    Integer selectAlreadyNotAgreeCount(Long planId) throws BusinessException;

    /**
     * 通过计划的id值找到这个计划的所有的审批流程的节点的个数
     *
     * @param planId 计划的id值
     * @return 审批节点的数量
     * @throws BusinessException 异常
     */
    Integer selectExamineApprovalCount(Long planId) throws BusinessException;
}
